PROJEKT - PRZYGOTOWANIE DANYCH I WIZUALIZACJA¶

Wczytywanie danych¶

W pierwszym kroku, za pomocą biblioteki pandas, wczytano dane z pliku CSV do struktury danych DataFrame. Funkcja load_csv(file_name) została zaimplementowana w celu wczytania danych z pliku o podanej nazwie.

In [1]:
#Loading Data
import os
import pandas as pd

def load_csv(file_name):
    current_dir = os.getcwd()
    file_path = os.path.join(current_dir, file_name)

    df = pd.read_csv(file_path)
    return df

# Replace 'Global_Country_Information_Dataset_2023.csv' with your actual .csv file name
df = load_csv('world-data-2023.csv')
df
Out[1]:
Country Density\n(P/Km2) Abbreviation Agricultural Land( %) Land Area(Km2) Armed Forces size Birth Rate Calling Code Capital/Major City Co2-Emissions ... Out of pocket health expenditure Physicians per thousand Population Population: Labor force participation (%) Tax revenue (%) Total tax rate Unemployment rate Urban_population Latitude Longitude
0 Afghanistan 60 AF 58.10% 652,230 323,000 32.49 93.0 Kabul 8,672 ... 78.40% 0.28 38,041,754 48.90% 9.30% 71.40% 11.12% 9,797,273 33.939110 67.709953
1 Albania 105 AL 43.10% 28,748 9,000 11.78 355.0 Tirana 4,536 ... 56.90% 1.20 2,854,191 55.70% 18.60% 36.60% 12.33% 1,747,593 41.153332 20.168331
2 Algeria 18 DZ 17.40% 2,381,741 317,000 24.28 213.0 Algiers 150,006 ... 28.10% 1.72 43,053,054 41.20% 37.20% 66.10% 11.70% 31,510,100 28.033886 1.659626
3 Andorra 164 AD 40.00% 468 NaN 7.20 376.0 Andorra la Vella 469 ... 36.40% 3.33 77,142 NaN NaN NaN NaN 67,873 42.506285 1.521801
4 Angola 26 AO 47.50% 1,246,700 117,000 40.73 244.0 Luanda 34,693 ... 33.40% 0.21 31,825,295 77.50% 9.20% 49.10% 6.89% 21,061,025 -11.202692 17.873887
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
190 Venezuela 32 VE 24.50% 912,050 343,000 17.88 58.0 Caracas 164,175 ... 45.80% 1.92 28,515,829 59.70% NaN 73.30% 8.80% 25,162,368 6.423750 -66.589730
191 Vietnam 314 VN 39.30% 331,210 522,000 16.75 84.0 Hanoi 192,668 ... 43.50% 0.82 96,462,106 77.40% 19.10% 37.60% 2.01% 35,332,140 14.058324 108.277199
192 Yemen 56 YE 44.60% 527,968 40,000 30.45 967.0 Sanaa 10,609 ... 81.00% 0.31 29,161,922 38.00% NaN 26.60% 12.91% 10,869,523 15.552727 48.516388
193 Zambia 25 ZM 32.10% 752,618 16,000 36.19 260.0 Lusaka 5,141 ... 27.50% 1.19 17,861,030 74.60% 16.20% 15.60% 11.43% 7,871,713 -13.133897 27.849332
194 Zimbabwe 38 ZW 41.90% 390,757 51,000 30.68 263.0 Harare 10,983 ... 25.80% 0.21 14,645,468 83.10% 20.70% 31.60% 4.95% 4,717,305 -19.015438 29.154857

195 rows × 35 columns

Informacje o danych¶

W drugim kroku, po wczytaniu danych do DataFrame df, użyto funkcji df.info() do uzyskania podstawowych informacji na temat struktury i zawartości danych.

Podsumowanie informacji o danych¶

DataFrame df zawiera 195 wierszy, które zawierają informacje o różnych krajach. Każdy wiersz składa się z 35 kolumn.

In [2]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 195 entries, 0 to 194
Data columns (total 35 columns):
 #   Column                                     Non-Null Count  Dtype  
---  ------                                     --------------  -----  
 0   Country                                    195 non-null    object 
 1   Density
(P/Km2)                            195 non-null    object 
 2   Abbreviation                               193 non-null    object 
 3   Agricultural Land( %)                      188 non-null    object 
 4   Land Area(Km2)                             194 non-null    object 
 5   Armed Forces size                          171 non-null    object 
 6   Birth Rate                                 189 non-null    float64
 7   Calling Code                               194 non-null    float64
 8   Capital/Major City                         195 non-null    object 
 9   Co2-Emissions                              188 non-null    object 
 10  CPI                                        178 non-null    object 
 11  CPI Change (%)                             179 non-null    object 
 12  Currency-Code                              180 non-null    object 
 13  Fertility Rate                             188 non-null    float64
 14  Forested Area (%)                          188 non-null    object 
 15  Gasoline Price                             175 non-null    object 
 16  GDP                                        193 non-null    object 
 17  Gross primary education enrollment (%)     188 non-null    object 
 18  Gross tertiary education enrollment (%)    183 non-null    object 
 19  Infant mortality                           189 non-null    float64
 20  Largest city                               189 non-null    object 
 21  Life expectancy                            187 non-null    float64
 22  Maternal mortality ratio                   181 non-null    float64
 23  Minimum wage                               150 non-null    object 
 24  Official language                          190 non-null    object 
 25  Out of pocket health expenditure           188 non-null    object 
 26  Physicians per thousand                    188 non-null    float64
 27  Population                                 194 non-null    object 
 28  Population: Labor force participation (%)  176 non-null    object 
 29  Tax revenue (%)                            169 non-null    object 
 30  Total tax rate                             183 non-null    object 
 31  Unemployment rate                          176 non-null    object 
 32  Urban_population                           190 non-null    object 
 33  Latitude                                   194 non-null    float64
 34  Longitude                                  194 non-null    float64
dtypes: float64(9), object(26)
memory usage: 53.4+ KB

Przetwarzanie kolumn¶

W trzecim kroku przeprowadzono przetwarzanie kolumn DataFrame df, które obejmuje m.in. usunięcie białych znaków z nazw kolumn i zmianę niektórych nazw w celu ujednolicenia ich formatu.

Usuwanie białych znaków z nazw kolumn¶

W pierwszej części kodu wykorzystano pętlę for wraz z funkcją strip() w celu usunięcia białych znaków (spacji, tabulacji itp.) z nazw wszystkich kolumn w DataFrame df. Operacja ta ma na celu zapobieganie problemom wynikającym z niezamierzonych białych znaków w nazwach kolumn, które mogłyby wpłynąć na poprawność przetwarzania danych.

Podsumowanie zmienionych nazw kolumn¶

Po przeprowadzeniu tych operacji, DataFrame df posiada kolumny o bardziej przejrzystych nazwach, co ułatwi dalszą analizę i manipulacje danymi.

In [3]:
for column in df.columns:
    column.strip()
    
df.rename(columns={'Density\n(P/Km2)': 'Density', 
                'Agricultural Land( %)': 'Agricultural Land (%)',
                'Urban_population': 'Urban population',
                'Co2-Emissions': 'CO2 Emissions',
                'Land Area(Km2)': 'Land Area'}, inplace=True)
In [4]:
df.columns
Out[4]:
Index(['Country', 'Density', 'Abbreviation', 'Agricultural Land (%)',
       'Land Area', 'Armed Forces size', 'Birth Rate', 'Calling Code',
       'Capital/Major City', 'CO2 Emissions', 'CPI', 'CPI Change (%)',
       'Currency-Code', 'Fertility Rate', 'Forested Area (%)',
       'Gasoline Price', 'GDP', 'Gross primary education enrollment (%)',
       'Gross tertiary education enrollment (%)', 'Infant mortality',
       'Largest city', 'Life expectancy', 'Maternal mortality ratio',
       'Minimum wage', 'Official language', 'Out of pocket health expenditure',
       'Physicians per thousand', 'Population',
       'Population: Labor force participation (%)', 'Tax revenue (%)',
       'Total tax rate', 'Unemployment rate', 'Urban population', 'Latitude',
       'Longitude'],
      dtype='object')

Przetwarzanie danych liczbowych¶

W czwartym kroku przeprowadzono przetwarzanie danych liczbowych znajdujących się w kolumnach DataFrame df. Operacje te mają na celu skonwertowanie wartości liczbowych w odpowiednich kolumnach z typu object (ciągi znaków) na typ float (liczby zmiennoprzecinkowe) w celu umożliwienia wykonywania matematycznych operacji i analizy danych liczbowych.

Lista kolumn z danymi liczbowymi¶

Przed przetwarzaniem danych liczbowych utworzono listę numerical_columns, która zawiera nazwy kolumn, w których znajdują się wartości liczbowe.

Konwersja typu danych i usuwanie zbędnych znaków¶

Następnie, dla każdej kolumny z listy numerical_columns, przeprowadzono szereg operacji w celu przygotowania danych do konwersji na typ float:

  1. Zmieniono typ danych kolumny na str (ciąg znaków) za pomocą astype(str), aby umożliwić dalsze operacje na ciągach.
  2. Usunięto zbędne znaki, takie jak przecinki, dolary i znaki procentu, za pomocą funkcji str.replace(). To umożliwiło usunięcie formatowania, które mogłoby zakłócić konwersję na liczbę zmiennoprzecinkową.
  3. Skonwertowano dane na typ float za pomocą astype(float), co zapewniło, że wartości liczbowe zostały odpowiednio zinterpretowane jako liczby zmiennoprzecinkowe.

Dzięki przetwarzaniu danych liczbowych DataFrame df został odpowiednio przygotowany do dalszej analizy. Wartości liczbowe w wybranych kolumnach zostały poprawnie skonwertowane na typ float, co pozwoli na wykonywanie różnych operacji matematycznych oraz analizę danych statystycznych w kolejnych etapach projektu.

In [5]:
numerical_columns = [
    'Density', 'Agricultural Land (%)', 'Land Area', 'Armed Forces size', 'Birth Rate',
    'CO2 Emissions', 'CPI', 'CPI Change (%)', 'Fertility Rate', 'Forested Area (%)',
    'Gasoline Price', 'GDP', 'Gross primary education enrollment (%)',
    'Gross tertiary education enrollment (%)', 'Infant mortality', 'Life expectancy',
    'Maternal mortality ratio', 'Minimum wage', 'Out of pocket health expenditure',
    'Physicians per thousand', 'Population', 'Population: Labor force participation (%)',
    'Tax revenue (%)', 'Total tax rate', 'Unemployment rate', 'Urban population', 'Latitude',
    'Longitude'
]
In [6]:
for column in numerical_columns:
    df[column] = df[column].astype(str)
    df[column] = df[column].str.replace(",","").str.replace("$","").str.replace("%","")
    df[column] = df[column].astype(float)

Łączenie danych o państwach z kodami ISO¶

W piątym kroku przeprowadzono łączenie danych zawartych w DataFrame df z danymi o państwach i ich kodach ISO, które zostały wczytane z osobnego pliku CSV o nazwie 'country_codes.csv'. Celem tego kroku jest dodanie informacji o kodach ISO do głównego DataFrame df, co pozwoli na skojarzenie danych geograficznych z danymi liczbowymi i wizualizację na mapach w Plotly.

Wczytywanie danych o kodach ISO¶

Przy użyciu funkcji load_csv('country_codes.csv') wczytano dane o państwach z kodami ISO do DataFrame df_codes. Ten osobny plik zawiera kolumny 'alpha-2' (kod ISO 2-cyfrowy), 'alpha-3' (kod ISO 3-cyfrowy), 'region' (region) i 'sub-region' (podregion).

Łączenie danych¶

W następnym kroku użyto funkcji pd.merge() w celu połączenia danych z DataFrame df z danymi z DataFrame df_codes. Do połączenia wykorzystano kolumnę 'Abbreviation' (skrótowa nazwa kraju) z DataFrame df oraz kolumnę 'alpha-2' z DataFrame df_codes. Operacja ta została wykonana z użyciem parametru how='inner', który oznacza, że zostaną zachowane tylko wiersze, które mają odpowiedniki w obu DataFrame'ach, eliminując tym samym państwa, dla których nie ma dostępnych kodów ISO.

Podsumowanie¶

DataFrame merged_df jest wynikiem łączenia danych z DataFrame df i DataFrame df_codes. Teraz w DataFrame merged_df znajdują się wszystkie informacje dotyczące państw, w tym dane liczbowe z DataFrame df oraz kody ISO (alpha-2 i alpha-3), region i podregion z DataFrame df_codes. Ten krok jest kluczowy dla stworzenia map w bibliotece Plotly, gdzie kod ISO pozwala na powiązanie danych liczbowych z odpowiednimi państwami na mapie.

In [7]:
df_codes = load_csv('country_codes.csv')
df_codes
Out[7]:
name alpha-2 alpha-3 country-code iso_3166-2 region sub-region intermediate-region region-code sub-region-code intermediate-region-code
0 Afghanistan AF AFG 4 ISO 3166-2:AF Asia Southern Asia NaN 142.0 34.0 NaN
1 Åland Islands AX ALA 248 ISO 3166-2:AX Europe Northern Europe NaN 150.0 154.0 NaN
2 Albania AL ALB 8 ISO 3166-2:AL Europe Southern Europe NaN 150.0 39.0 NaN
3 Algeria DZ DZA 12 ISO 3166-2:DZ Africa Northern Africa NaN 2.0 15.0 NaN
4 American Samoa AS ASM 16 ISO 3166-2:AS Oceania Polynesia NaN 9.0 61.0 NaN
... ... ... ... ... ... ... ... ... ... ... ...
244 Wallis and Futuna WF WLF 876 ISO 3166-2:WF Oceania Polynesia NaN 9.0 61.0 NaN
245 Western Sahara EH ESH 732 ISO 3166-2:EH Africa Northern Africa NaN 2.0 15.0 NaN
246 Yemen YE YEM 887 ISO 3166-2:YE Asia Western Asia NaN 142.0 145.0 NaN
247 Zambia ZM ZMB 894 ISO 3166-2:ZM Africa Sub-Saharan Africa Eastern Africa 2.0 202.0 14.0
248 Zimbabwe ZW ZWE 716 ISO 3166-2:ZW Africa Sub-Saharan Africa Eastern Africa 2.0 202.0 14.0

249 rows × 11 columns

In [8]:
merged_df = pd.merge(df, df_codes[['alpha-2', 'alpha-3', 'region', 'sub-region']], left_on='Abbreviation', right_on='alpha-2', how='inner')

merged_df
Out[8]:
Country Density Abbreviation Agricultural Land (%) Land Area Armed Forces size Birth Rate Calling Code Capital/Major City CO2 Emissions ... Tax revenue (%) Total tax rate Unemployment rate Urban population Latitude Longitude alpha-2 alpha-3 region sub-region
0 Afghanistan 60.0 AF 58.1 652230.0 323000.0 32.49 93.0 Kabul 8672.0 ... 9.3 71.4 11.12 9797273.0 33.939110 67.709953 AF AFG Asia Southern Asia
1 Albania 105.0 AL 43.1 28748.0 9000.0 11.78 355.0 Tirana 4536.0 ... 18.6 36.6 12.33 1747593.0 41.153332 20.168331 AL ALB Europe Southern Europe
2 Algeria 18.0 DZ 17.4 2381741.0 317000.0 24.28 213.0 Algiers 150006.0 ... 37.2 66.1 11.70 31510100.0 28.033886 1.659626 DZ DZA Africa Northern Africa
3 Andorra 164.0 AD 40.0 468.0 NaN 7.20 376.0 Andorra la Vella 469.0 ... NaN NaN NaN 67873.0 42.506285 1.521801 AD AND Europe Southern Europe
4 Angola 26.0 AO 47.5 1246700.0 117000.0 40.73 244.0 Luanda 34693.0 ... 9.2 49.1 6.89 21061025.0 -11.202692 17.873887 AO AGO Africa Sub-Saharan Africa
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
190 Venezuela 32.0 VE 24.5 912050.0 343000.0 17.88 58.0 Caracas 164175.0 ... NaN 73.3 8.80 25162368.0 6.423750 -66.589730 VE VEN Americas Latin America and the Caribbean
191 Vietnam 314.0 VN 39.3 331210.0 522000.0 16.75 84.0 Hanoi 192668.0 ... 19.1 37.6 2.01 35332140.0 14.058324 108.277199 VN VNM Asia South-eastern Asia
192 Yemen 56.0 YE 44.6 527968.0 40000.0 30.45 967.0 Sanaa 10609.0 ... NaN 26.6 12.91 10869523.0 15.552727 48.516388 YE YEM Asia Western Asia
193 Zambia 25.0 ZM 32.1 752618.0 16000.0 36.19 260.0 Lusaka 5141.0 ... 16.2 15.6 11.43 7871713.0 -13.133897 27.849332 ZM ZMB Africa Sub-Saharan Africa
194 Zimbabwe 38.0 ZW 41.9 390757.0 51000.0 30.68 263.0 Harare 10983.0 ... 20.7 31.6 4.95 4717305.0 -19.015438 29.154857 ZW ZWE Africa Sub-Saharan Africa

195 rows × 39 columns

Tworzenie mapy Choropleth¶

W szóstym kroku przeprowadzono tworzenie mapy Choropleth za pomocą biblioteki Plotly. Mapa ta pozwoli na wizualizację danych o populacji różnych państw na mapie świata.

Tworzenie obiektu Figure¶

Na początku utworzono obiekt Figure za pomocą klasy go.Figure(), który posłuży do tworzenia wykresów w bibliotece Plotly.

Dodawanie mapy Choropleth¶

Do obiektu Figure dodano mapę Choropleth za pomocą klasy go.Choropleth(). W mapie wykorzystano dane z DataFrame merged_df:

  • locations: Kolumna 'alpha-3' z DataFrame merged_df, która zawiera kody ISO 3-cyfrowe państw, służące do umiejscowienia danych na mapie.
  • z: Kolumna 'Population' z DataFrame merged_df, która zawiera informacje o populacji poszczególnych państw, które będą reprezentowane na mapie.
  • colorscale: Skala kolorów, w tym przypadku 'Reds', która określa odcienie czerwieni dla różnych wartości.
  • text: Kolumna 'Country' z DataFrame merged_df, która dostarcza tekstowy opis państw, który będzie wyświetlany na mapie.
  • colorbar_title: Tytuł dla legendy kolorów.

Za pomocą fig.update_geos(projection_type='natural earth') ustawiono projekcję mapy na 'natural earth'. Ta opcja zapewnia odpowiedni wygląd mapy świata.

Za pomocą fig.update_layout() dokonano konfiguracji układu mapy. W tym przypadku ustawiono tytuł wykresu oraz określono wysokość i marginesy, aby dostosować prezentację mapy.

In [9]:
import plotly.graph_objects as go
import plotly.express as px
import json
import pandas as pd
import numpy as np
In [10]:
fig = go.Figure(
    go.Choropleth(locations=merged_df['alpha-3'],
            z=merged_df['Population'],
            colorscale='Reds',
            text = merged_df['Country'],
            colorbar_title = 'Population',
            marker_line_width=0.5
                    ))

fig.update_geos(projection_type='natural earth')

fig.update_layout(title='<b>Countries by population.</b>',
    height=300,
    margin={"r":40,"t":40,"l":40,"b":0})

fig.show()

Możliwości filtrowania mapy¶

In [11]:
european_df = merged_df[merged_df['region'] == 'Europe'].copy()

fig = go.Figure(
    go.Choropleth(locations=european_df['alpha-3'],
            z=european_df['Population'],
            colorscale='Reds',
            reversescale=False,
            text = european_df['Country'],
            colorbar_title = 'Population',
            marker_line_width=0.5
                    ))

fig.update_geos(scope='europe',resolution=50)
fig.update_geos(projection_type='natural earth')

fig.update_layout(title='<b>Countries by population.</b>',
    height=300,
    margin={"r":40,"t":40,"l":40,"b":0})

fig.show()
In [12]:
asia_df = merged_df[merged_df['region'] == 'Asia'].copy()

fig = go.Figure(
    go.Choropleth(locations = asia_df['alpha-3'],
            z = asia_df['Population'],
            colorscale = 'Reds',
            reversescale = False,
            text = asia_df['Country'],
            colorbar_title = 'Population',
            marker_line_width=0.5
                    ))

fig.update_geos(scope='asia',resolution=50)
fig.update_geos(projection_type='natural earth')

fig.update_layout(title='<b>Countries by population.</b>',
    height=300,
    margin={"r":40,"t":40,"l":40,"b":0})

fig.show()
In [13]:
america_df = merged_df[merged_df['region'] == 'Americas'].copy()

fig = go.Figure(
    go.Choropleth(locations = america_df['alpha-3'],
            z = america_df['Population'],
            colorscale = 'Reds',
            reversescale = False,
            text = america_df['Country'],
            colorbar_title = 'Population',
            marker_line_width=0.5
                    ))

fig.update_geos(scope='north america',resolution=50)
fig.update_geos(projection_type='natural earth')

fig.update_layout(title='<b>Countries by population.</b>',
    height=300,
    margin={"r":40,"t":40,"l":40,"b":0})

fig.show()
In [14]:
merged_df['sub-region'].unique()
Out[14]:
array(['Southern Asia', 'Southern Europe', 'Northern Africa',
       'Sub-Saharan Africa', 'Latin America and the Caribbean',
       'Western Asia', 'Australia and New Zealand', 'Western Europe',
       'Eastern Europe', 'South-eastern Asia', 'Northern America',
       'Eastern Asia', 'Northern Europe', 'Melanesia', 'Central Asia',
       'Micronesia', 'Polynesia'], dtype=object)
In [15]:
south_america_df = merged_df[merged_df['sub-region'] == 'Latin America and the Caribbean'].copy()

fig = go.Figure(
    go.Choropleth(locations = south_america_df['alpha-3'],
            z = south_america_df['Population'],
            colorscale = 'Reds',
            reversescale = False,
            text = south_america_df['Country'],
            colorbar_title = 'Population',
            marker_line_width=0.5
                    ))

fig.update_geos(scope='south america',resolution=50)
fig.update_geos(projection_type='natural earth')

fig.update_layout(title='<b>Countries by population.</b>',
    height=300,
    margin={"r":40,"t":40,"l":40,"b":0})

fig.show()

Dodawanie współrzędnych geograficznych stolic państw i wyrysowanie ich na mapie¶

W siódmym kroku wczytano dodatkowe dane zawierające szerokość i długość geograficzną stolic państw z pliku 'country_capitals.csv'. Następnie, połączono te dane z głównym DataFrame df za pomocą funkcji pd.merge(), tworząc merged_df_2, aby wzbogacić DataFrame o współrzędne geograficzne stolic państw.

Utworzenie obiektu Figure z Scattergeo¶

Za pomocą klasy go.Figure(data=go.Scattergeo()) utworzono obiekt Figure z mapą Scattergeo, który posłuży do wyrysowania współrzędnych geograficznych stolic na mapie.

Wyrysowanie współrzędnych stolic na mapie¶

W obiekcie Figure użyto klasy go.Scattergeo() z danymi z DataFrame merged_df_2 do wyrysowania współrzędnych geograficznych stolic państw na mapie. Za pomocą parametrów lon i lat określono odpowiednio długość i szerokość geograficzną stolic. Dodatkowo, przy użyciu parametrów hovertext i customdata ustalono odpowiednie etykiety dla państw i ich stolic, które będą wyświetlane po najechaniu na punkty na mapie.

Konfiguracja mapy¶

Za pomocą fig.update_geos() skonfigurowano wygląd mapy. W pierwszym przypadku użyto parametru scope='world', aby wyświetlić mapę całego świata. W drugim przypadku użyto parametru scope='europe', aby wyświetlić mapę wyłącznie Europy. Dodatkowo, użyto parametrów lonaxis_range, lataxis_range i center, aby skupić mapę na obszarze Europy i odpowiednio ją wyśrodkować.

Ustawienie tytułu i wyświetlenie mapy¶

Za pomocą fig.update_layout() ustawiono odpowiedni tytuł wykresu. Następnie za pomocą fig.show() wyświetlono mapę, która prezentuje stolice państw na mapie świata lub Europy w zależności od wybranej konfiguracji.

In [16]:
df_capitals = load_csv('country_capitals.csv')
df_capitals 
Out[16]:
latitude longitude countryCode continent
0 -54.283333 -36.500000 GS Antarctica
1 -49.350000 70.216667 TF Antarctica
2 31.766667 35.233333 PS Asia
3 60.116667 19.900000 AX Europe
4 -0.547700 166.920867 NR Australia
... ... ... ... ...
239 35.183333 33.366667 NaN Europe
240 22.285000 114.158000 HK Asia
241 0.000000 0.000000 HM Antarctica
242 -7.300000 72.400000 IO Africa
243 0.000000 0.000000 MO Asia

244 rows × 4 columns

In [17]:
merged_df_2 = pd.merge(df, df_capitals[['latitude', 'longitude', 'countryCode']], left_on='Abbreviation', right_on='countryCode', how='inner')

merged_df_2
Out[17]:
Country Density Abbreviation Agricultural Land (%) Land Area Armed Forces size Birth Rate Calling Code Capital/Major City CO2 Emissions ... Population: Labor force participation (%) Tax revenue (%) Total tax rate Unemployment rate Urban population Latitude Longitude latitude longitude countryCode
0 Afghanistan 60.0 AF 58.1 652230.0 323000.0 32.49 93.0 Kabul 8672.0 ... 48.9 9.3 71.4 11.12 9797273.0 33.939110 67.709953 34.516667 69.183333 AF
1 Albania 105.0 AL 43.1 28748.0 9000.0 11.78 355.0 Tirana 4536.0 ... 55.7 18.6 36.6 12.33 1747593.0 41.153332 20.168331 41.316667 19.816667 AL
2 Algeria 18.0 DZ 17.4 2381741.0 317000.0 24.28 213.0 Algiers 150006.0 ... 41.2 37.2 66.1 11.70 31510100.0 28.033886 1.659626 36.750000 3.050000 DZ
3 Andorra 164.0 AD 40.0 468.0 NaN 7.20 376.0 Andorra la Vella 469.0 ... NaN NaN NaN NaN 67873.0 42.506285 1.521801 42.500000 1.516667 AD
4 Angola 26.0 AO 47.5 1246700.0 117000.0 40.73 244.0 Luanda 34693.0 ... 77.5 9.2 49.1 6.89 21061025.0 -11.202692 17.873887 -8.833333 13.216667 AO
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
192 Venezuela 32.0 VE 24.5 912050.0 343000.0 17.88 58.0 Caracas 164175.0 ... 59.7 NaN 73.3 8.80 25162368.0 6.423750 -66.589730 10.483333 -66.866667 VE
193 Vietnam 314.0 VN 39.3 331210.0 522000.0 16.75 84.0 Hanoi 192668.0 ... 77.4 19.1 37.6 2.01 35332140.0 14.058324 108.277199 21.033333 105.850000 VN
194 Yemen 56.0 YE 44.6 527968.0 40000.0 30.45 967.0 Sanaa 10609.0 ... 38.0 NaN 26.6 12.91 10869523.0 15.552727 48.516388 15.350000 44.200000 YE
195 Zambia 25.0 ZM 32.1 752618.0 16000.0 36.19 260.0 Lusaka 5141.0 ... 74.6 16.2 15.6 11.43 7871713.0 -13.133897 27.849332 -15.416667 28.283333 ZM
196 Zimbabwe 38.0 ZW 41.9 390757.0 51000.0 30.68 263.0 Harare 10983.0 ... 83.1 20.7 31.6 4.95 4717305.0 -19.015438 29.154857 -17.816667 31.033333 ZW

197 rows × 38 columns

In [18]:
fig = go.Figure(data=go.Scattergeo(
        lon = merged_df_2['longitude'],
        lat = merged_df_2['latitude'],
        mode = 'markers',
        name='',
        customdata=merged_df_2['Capital/Major City'],
        hovertext=merged_df_2['Country'],
        hovertemplate='Country: %{hovertext}<br>Capital: %{customdata}',
        marker = dict(
            size = 5,
            opacity = 0.8,
            reversescale = True,
            autocolorscale = False,
            color='#fee08b',
            symbol = 'circle',
            line = dict(
                width=1,
                color='#000000'
            ),
        )))
fig.update_geos(scope='world',
    #lonaxis_range=[ -20.0, 37.0 ],
    #lataxis_range=[ 30.0, 60.0 ],
    #center={'lat': 51.919438, 'lon': 19.145136},
    resolution=50,
    landcolor='#f0f0f0',
    countrycolor='#000000',
    coastlinecolor='#000000')
fig.update_layout(title=dict(
        text='<b>Capitals</b>',
        xanchor='center',
        x=.5),
    margin={"r":0,"t":50,"l":0,"b":0},
)
fig.show()

Filtrowanie mapy - europejskie stolice¶

W ósmym kroku wykluczono konkretne państwa spoza Europy, aby utworzyć mapę wyłącznie stolic państw europejskich. W tym celu utworzono listę excluded_countries zawierającą nazwy państw, które mają zostać pominięte na mapie. Następnie, użyto metody query() na DataFrame merged_df_2, aby wykluczyć państwa znajdujące się na liście excluded_countries. Wynik tego zapytania zapisano w filtered_merged_df.

Podobnie jak wcześniej, za pomocą klasy go.Figure(data=go.Scattergeo()) utworzono obiekt Figure z mapą Scattergeo, używając danych z filtered_merged_df do wyrysowania współrzędnych geograficznych stolic państw europejskich na mapie.

Reszta kodu jest analogiczna do poprzedniego, w tym ustawienie wyglądu mapy, tytułu i wyświetlenie mapy.

In [19]:
# Wyklucz konkretne państwa
excluded_countries = ["Morocco", "Algeria", "Tunisia", "Turkey", "Palestinian National Authority",
                      "Lebanon", "Syria", "Iraq", "Armenia", "Georgia", "Azerbaijan",
                     "Jordan", "Israel", "Namibia", "Eswatini"]
In [20]:
filtered_merged_df = merged_df_2.query("Country not in @excluded_countries").copy()
In [21]:
fig = go.Figure(data=go.Scattergeo(
        lon = filtered_merged_df['longitude'],
        lat = filtered_merged_df['latitude'],
        mode = 'markers',
        name='',
        customdata=filtered_merged_df['Capital/Major City'],
        hovertext=filtered_merged_df['Country'],
        hovertemplate='Country: %{hovertext}<br>Capital: %{customdata}',
        marker = dict(
            size = 8,
            opacity = 0.8,
            reversescale = True,
            autocolorscale = False,
            color='#fee08b',
            symbol = 'circle',
            line = dict(
                width=1,
                color='#000000'
            ),
        )))
fig.update_geos(scope='europe',
    lonaxis_range=[ -20.0, 37.0 ],
    lataxis_range=[ 30.0, 60.0 ],
    center={'lat': 51.919438, 'lon': 19.145136},
    resolution=50,
    landcolor='#f0f0f0',
    countrycolor='#000000',
    coastlinecolor='#000000')
fig.update_layout(title=dict(
        text='<b>Capitals of Europe</b>',
        xanchor='center',
        x=.5),
    margin={"r":0,"t":50,"l":0,"b":0},
)
fig.show()

Tworzenie wykresu słupkowego dla 10 krajów o najwyższych emisjach CO2¶

W dziewiątym kroku przeprowadzono tworzenie interaktywnego wykresu słupkowego dla 10 krajów, które emitują największą ilość CO2. Dane do tego wykresu pochodzą z DataFrame df, gdzie kolumna 'CO2 Emissions' zawiera informacje o emisji CO2 poszczególnych krajów.

Wybór 10 krajów z największymi emisjami CO2¶

Za pomocą df.nlargest(10, columns='CO2 Emissions') wybrano 10 krajów o największej emisji CO2 i utworzono DataFrame top_10_co2_emissions_df.

Tworzenie wykresu słupkowego¶

Za pomocą px.bar() z biblioteki Plotly Express utworzono wykres słupkowy fig_top_10_emissions. Wykres ten przedstawia 10 krajów z najwyższą emisją CO2 na osi X, a wartości emisji CO2 dla tych krajów na osi Y.

Ustawienie tytułu i etykiet

Za pomocą parametrów title i labels nadano odpowiednie tytuły wykresu i etykiety osi Y.

Wyświetlenie interaktywnego wykresu słupkowego

Za pomocą fig_top_10_emissions.show() wyświetlono interaktywny wykres słupkowy, który prezentuje 10 krajów o najwyższej emisji CO2. Wykres umożliwia interakcję użytkownika z danymi, dostępne jest przybliżenie i wyświetlenie dokładnych wartości po najechaniu kursorem.

In [22]:
import plotly.express as px

# Select the top 10 countries with highest CO2 emissions
top_10_co2_emissions_df = df.nlargest(10, columns='CO2 Emissions')

# Create the bar chart for the top 10 countries with highest CO2 Emissions
fig_top_10_emissions = px.bar(
    top_10_co2_emissions_df,
    x='Country',
    y='CO2 Emissions',
    title='Top 10 Countries with Highest CO2 Emissions',
    labels={'CO2 Emissions': 'CO2 Emissions'},
)

# Show the interactive bar chart
fig_top_10_emissions.show()

Obliczanie emisji CO2 na mieszkańca¶

W dziesiątym kroku obliczono emisję CO2 na mieszkańca dla wszystkich państw, korzystając z danych z DataFrame df. Do tego celu użyto kolumn 'CO2 Emissions' i 'Population', a wynik został zapisany w nowej kolumnie o nazwie 'CO2 Emissions per Population'.

Tworzenie wykresu słupkowego dla 10 krajów o najwyższej emisji CO2 na mieszkańca¶

Za pomocą df.nlargest(10, columns='CO2 Emissions per Population') wybrano 10 krajów o najwyższej emisji CO2 na mieszkańca i utworzono DataFrame top_10_co2_per_pop_df.

Następnie, za pomocą px.bar() z biblioteki Plotly Express utworzono wykres słupkowy fig_top_10, który przedstawia te 10 krajów na osi X i wartości emisji CO2 na mieszkańca na osi Y.

Ustawienie tytułu i etykiet dla wykresu

Za pomocą parametrów title i labels nadano odpowiednie tytuły wykresu i etykiety osi Y.

Tworzenie wykresu słupkowego dla 10 krajów o najniższej emisji CO2 na mieszkańca¶

Za pomocą df.nsmallest(10, columns='CO2 Emissions per Population') powtórzono operacje, tym razem otrzymując 10 krajów o najniższej emisji CO2 na mieszkańca.

In [23]:
# Calculate CO2 Emissions per Population for all countries
df['CO2 Emissions per Population'] = df['CO2 Emissions'] / df['Population']

# Sort the DataFrame by CO2 Emissions per Population in descending order and select the top 10 countries
top_10_co2_per_pop_df = df.nlargest(10, columns='CO2 Emissions per Population')

fig_top_10 = px.bar(
    top_10_co2_per_pop_df,
    x='Country',
    y='CO2 Emissions per Population',
    title='Countries with Highest CO2 Emissions per Population',
    labels={'CO2 Emissions per Population': 'CO2 Emissions per Population'},
)

# Sort the DataFrame by CO2 Emissions per Population in ascending order and select the bottom 10 countries
bottom_10_co2_per_pop_df = df.nsmallest(10, columns='CO2 Emissions per Population')

fig_bottom_10 = px.bar(
    bottom_10_co2_per_pop_df,
    x='Country',
    y='CO2 Emissions per Population',
    title='Countries with Lowest CO2 Emissions per Population',
    labels={'CO2 Emissions per Population': 'CO2 Emissions per Population'},
)

# Show the interactive bar charts
fig_top_10.show()
fig_bottom_10.show()

Podsumowanie¶

W trakcie tego projektu zdobyłem różnorodne umiejętności techniczne w języku Python, które są kluczowe przy analizie danych i wizualizacji.

Wczytywanie danych z plików CSV¶

Nauczyłem się wczytywać dane z plików CSV do obiektów DataFrame przy użyciu biblioteki Pandas.

Łączenie danych z różnych źródeł¶

Zapoznałem się z operacją łączenia danych z różnych DataFrame'ów na podstawie wspólnych kluczy przy pomocy pd.merge(). Ta umiejętność była przydatna, gdy chciałem wzbogacić dane o dodatkowe informacje.

Manipulacja danymi w Pandas DataFrame¶

Zapoznałem się z różnymi operacjami manipulacji danymi w DataFrame, takimi jak dodawanie nowych kolumn, usuwanie niepotrzebnych kolumn, filtrowanie wierszy oraz zmiana typów danych kolumn. Dzięki temu byłem w stanie przygotować dane do analizy.

Wizualizacja danych na mapach¶

Dzięki bibliotece Plotly, nauczyłem się tworzyć interaktywne mapy Choropleth, które prezentują dane geograficzne w atrakcyjny sposób.

Tworzenie wykresów słupkowych¶

W ramach nauki biblioteki Plotly Express, zdobyłem umiejętność generowania wykresów słupkowych, które umożliwiają szybką i interaktywną wizualizację danych liczbowych.

Zakończenie¶

Opanowałem tworzenie interaktywnych wykresów i map przy pomocy Plotly, które są użytecznym narzędziem do prezentacji danych w bardziej przystępny sposób. Te umiejętności pomogły mi tworzyć wizualizacje, które są atrakcyjne i zrozumiałe dla odbiorców.

Projekt dostarczył mi praktycznych umiejętności w analizie i wizualizacji danych w języku Python.